using System;
using System.Collections.Generic;

namespace libcharakter
{
	[Serializable]
	public class BasisWert : Attribute
	{
		public BasisWert (string name, Charakter charakter)
			: base(name, 0,0, TableColum.User, false, charakter)
		{
            CalcValue(charakter.Eigenschaften, charakter.Wunden);
		}
        public override void Update(Charakter charakter)
        {
            CalcValue(Charakter.Eigenschaften, charakter.Wunden);
        }
        protected virtual void CalcValue (Eigenschaften eigenschaftenm, int wunden)
		{

		}
	}
	[Serializable]
	public class Lebenspunkte : BasisWert
	{
		public Lebenspunkte (Charakter charakter) 
		: base("Lebenspunkte", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Konstitution"].Value + eigenschaften["Körperkraft"].Value 
				+ eigenschaften["Körperkraft"].Value;

			Value = ( wert / 2 );
		}
	}
	[Serializable]
	public class Ausdauer : BasisWert
	{
		public Ausdauer (Charakter charakter) 
		: base("Ausdauer", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Mut"].Value + eigenschaften["Konstitution"].Value 
				+ eigenschaften["Gewandheit"].Value;

			Value = ( wert / 2 );
		}
	}
	[Serializable]
	public class Astralenergie : BasisWert
	{
		public Astralenergie (Charakter charakter) 
		: base("Astralenergie", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Mut"].Value + eigenschaften["Intuition"].Value 
				+ eigenschaften["Charisma"].Value;

			Value = ( wert / 2 );
		}
	}
	[Serializable]
	public class IniBasisWert : BasisWert
	{
		public IniBasisWert (Charakter charakter) 
		: base("INI-Basiswert", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Mut"].Value + eigenschaften["Mut"].Value + eigenschaften["Intuition"].Value 
				+ eigenschaften["Gewandheit"].Value;

            Value = ( wert / 5 )- (2*wunden);
		}
	}
	[Serializable]
	public class Magieresistenz : BasisWert
	{
		public Magieresistenz (Charakter charakter) 
		: base("Magieresistenz", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Mut"].Value + eigenschaften["Klugheit"].Value 
				+ eigenschaften["Konstitution"].Value;

			Value = ( wert / 5 );
		}
	}
	[Serializable]
	public class AtBasisWert : BasisWert
	{
		public AtBasisWert (Charakter charakter) 
		: base("AT-Basiswert", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Mut"].Value + eigenschaften["Gewandheit"].Value 
				+ eigenschaften["Körperkraft"].Value;

            Value = ( wert / 5 ) - (2*wunden);
		}
	}
	[Serializable]
	public class PaBasisWert : BasisWert
	{
		public PaBasisWert (Charakter charakter) 
		: base("PA-Basiswert", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
			int wert = eigenschaften["Intuition"].Value + eigenschaften["Gewandheit"].Value 
				+ eigenschaften["Körperkraft"].Value;

            Value = ( wert / 5 )- (2*wunden);
		}
	}
	[Serializable]
	public class FkBasisWert : BasisWert
	{
		public FkBasisWert (Charakter charakter) 
		: base("FK-Basiswert", charakter)
		{
		}
        protected override void CalcValue (Eigenschaften eigenschaften, int wunden)
		{
            int wert = eigenschaften["Intuition"].Value + eigenschaften["Fingerfertigkeit"].Value 
				+ eigenschaften["Körperkraft"].Value;

            Value = ( wert / 5 )- (2*wunden);
		}
	}

	[Serializable]
	public class BasisWerte : Attribute
	{
		private List<BasisWert> m_werte;

		public BasisWert this [string n] 
		{
			get 
			{ 
				for (int i = 0; i < m_werte.Count; i++) 
				{
					if(n == m_werte[i].Name)
						return m_werte[i];
				}
				return null; 
			}
		}

		public BasisWerte (Charakter eg)
			: base("BasisWerte", 0,0, TableColum.User, false, eg)
		{
			m_werte = new List<BasisWert>();

			m_werte.Add(new Lebenspunkte(eg));
			m_werte.Add(new Ausdauer(eg));
			m_werte.Add(new Astralenergie(eg));
			m_werte.Add(new IniBasisWert(eg));
			m_werte.Add(new Magieresistenz(eg));
			m_werte.Add(new AtBasisWert(eg));
			m_werte.Add(new PaBasisWert(eg));
			m_werte.Add(new FkBasisWert(eg));
		}
		public override string ToString ()
		{
			return string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n", 
			                     this["Lebenspunkte"], 
			                     this["Ausdauer"], 
			                     this["Astralenergie"], 
			                     this["Magieresistenz"],
			                     this["INI-Basiswert"], 
			                     this["AT-Basiswert"],
			                     this["PA-Basiswert"], 
			                     this["FK-Basiswert"]);
		}
        public override void Update (libcharakter.Charakter charakter)
		{
			foreach (var item in m_werte) 
			{
                item.Update(charakter);
			}
		}
	}
}

